package Orm.jdbc.ormdiy;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Locale;

public class DefaultResultHandler<R> implements ResultHandler<R>{

    @Override
    public R handle(ResultSet rs) {
        return null;
    }

    @Override
    public R handle(ResultSet rs, Class<?> domainClass) {
        try {
            // 结果集元数据
            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            int count = resultSetMetaData.getColumnCount();
            BeanInfo beanInfo = Introspector.getBeanInfo(domainClass);
            //获取属性描述器数组
            PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
            if (rs.next()) {
                //因为不能通过泛型获得T的实例，所以通过反射技术来获得T的实例！！！
                R t = (R) domainClass.newInstance();
                for (int i = 1; i <= count; i++) {
                    String columnName = resultSetMetaData.getColumnName(i);
                    // 获得列名 --- 需要去查找匹配属性
                    for (PropertyDescriptor propertyDescriptor : descriptors) {
                        String columnName1 = columnName.toLowerCase(Locale.ROOT);
                        String beanName = propertyDescriptor.getName().toLowerCase(Locale.ROOT);
                        // 列名 存在 同名属性 ---- 列值 存到属性里
                        if (columnName1.equals(beanName)) {
                            // 得到属性的写方法，如同setName、setMoney等方法
                            Method writeMethod = propertyDescriptor.getWriteMethod();
                            writeMethod.invoke(t, rs.getObject(columnName));
                        }
                    }
                }
                return t;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
